home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 33 / Amiga Format AFCD33 (Issue 117, Dec 1998).iso / -seriously_amiga- / graphics / splitmpegppc / src / util.h < prev   
C/C++ Source or Header  |  1998-09-07  |  14KB  |  229 lines

  1. /*
  2.  * Copyright (c) 1992 The Regents of the University of California.
  3.  * All rights reserved.
  4.  * 
  5.  * Permission to use, copy, modify, and distribute this software and its
  6.  * documentation for any purpose, without fee, and without written agreement is
  7.  * hereby granted, provided that the above copyright notice and the following
  8.  * two paragraphs appear in all copies of this software.
  9.  * 
  10.  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
  11.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  12.  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
  13.  * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  14.  * 
  15.  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  16.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  17.  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  18.  * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
  19.  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  20.  *
  21.  * I can be contacted via 
  22.  * Email: michael@ecel.uwa.edu.au
  23.  * Post: P.O. Box 506, NEDLANDS WA 6009, AUSTRALIA
  24.  *
  25.  * Amigaversion by Tobias Seiler in 1997
  26.  * Email: tabs@blader.com
  27.  */
  28.  
  29.  
  30. /* Macro for updating bit counter if analysis tool is on. */
  31. #ifdef ANALYSIS
  32. #define UPDATE_COUNT(numbits) bitCount += numbits
  33. #else
  34. #define UPDATE_COUNT(numbits)
  35. #endif
  36.  
  37. #define get_bits1(result)                                                 \
  38. {                                                                         \
  39.                                                                           \
  40.   /* Check for underflow. */                                              \
  41.                                                                           \
  42.   if (bufLength < 2) {                                                    \
  43.     correct_underflow();                                                  \
  44.   }                                                                       \
  45.   UPDATE_COUNT(1);                                                        \
  46.                                                                           \
  47.   if (bitOffset < 31) {                                                   \
  48.     *(result) = ((curBits & bitTest[bitOffset]) != 0);                    \
  49.     bitOffset++;                                                          \
  50.   }                                                                       \
  51.   else {                                                                  \
  52.     *(result) = (curBits & 0x00000001);                                   \
  53.     bitOffset = 0;                                                        \
  54.     bitBuffer++;                                                          \
  55.     curBits = *bitBuffer;                                                 \
  56.     bufLength--;                                                          \
  57.   }                                                                       \
  58. }
  59.  
  60. #define get_bits2(result)                                                 \
  61. {                                                                         \
  62.                                                                           \
  63.   /* Check for underflow. */                                              \
  64.                                                                           \
  65.   if (bufLength < 2) {                                                    \
  66.     correct_underflow();                                                  \
  67.   }                                                                       \
  68.   UPDATE_COUNT(2);                                                        \
  69.                                                                           \
  70.   if (bitOffset < 30) {                                                   \
  71.     *(result) = ((curBits & bitMask[bitOffset]) >>                        \
  72.            (30-bitOffset));                                               \
  73.     bitOffset += 2;                                                       \
  74.   }                                                                       \
  75.   else if (bitOffset == 30) {                                             \
  76.     *(result) = (curBits & 0x00000003);                                   \
  77.     bitOffset = 0;                                                        \
  78.     bitBuffer++;                                                          \
  79.     curBits = *bitBuffer;                                                 \
  80.     bufLength--;                                                          \
  81.   }                                                                       \
  82.   else {                                                                  \
  83.     *(result) = (((curBits & 0x01) << 1) |                                \
  84.            ((*(bitBuffer+1) & 0x80000000) != 0));                         \
  85.     bitOffset = 1;                                                        \
  86.     bitBuffer++;                                                          \
  87.     curBits = *bitBuffer;                                                 \
  88.     bufLength--;                                                          \
  89.   }                                                                       \
  90. }
  91.  
  92. #define get_bitsX(num, thresh, result)                                    \
  93. {                                                                         \
  94.   int OFFnum = (bitOffset - thresh);                                      \
  95.                                                                           \
  96.   /* Check for underflow. */                                              \
  97.                                                                           \
  98.   if (bufLength < 2) {                                                    \
  99.     correct_underflow();                                                  \
  100.   }                                                                       \
  101.   UPDATE_COUNT(num);                                                      \
  102.                                                                           \
  103.   if (OFFnum < 0) {                                                       \
  104.     *(result) = ((curBits & bitMask[bitOffset]) >> (-OFFnum));            \
  105.     bitOffset += num;                                                     \
  106.   } else if (OFFnum == 0) {                                               \
  107.     *(result) = (curBits & bitMask[bitOffset]) << OFFnum;                 \
  108.     bitBuffer++;                                                          \
  109.     curBits = *bitBuffer;                                                 \
  110.     bufLength--;                                                          \
  111.     bitOffset = 0;                                                        \
  112.   } else {                                                                \
  113.     *(result) = (((curBits & bitMask[bitOffset]) << OFFnum) |             \
  114.              ((*(bitBuffer+1) & (nBitMask[OFFnum])) >> (32-OFFnum)));     \
  115.     bitBuffer++;                                                          \
  116.     curBits = *bitBuffer;                                                 \
  117.     bufLength--;                                                          \
  118.     bitOffset = OFFnum;                                                   \
  119.   }                                                                       \
  120. }
  121.  
  122. #define get_bits3(result)  get_bitsX( 3, 29, result)
  123. #define get_bits4(result)  get_bitsX( 4, 28, result)
  124. #define get_bits5(result)  get_bitsX( 5, 27, result)
  125. #define get_bits6(result)  get_bitsX( 6, 26, result)
  126. #define get_bits7(result)  get_bitsX( 7, 25, result)
  127. #define get_bits8(result)  get_bitsX( 8, 24, result)
  128. #define get_bits9(result)  get_bitsX( 9, 23, result)
  129. #define get_bits10(result) get_bitsX(10, 22, result)
  130. #define get_bits11(result) get_bitsX(11, 21, result)
  131. #define get_bits12(result) get_bitsX(12, 20, result)
  132. #define get_bits13(result) get_bitsX(13, 19, result)
  133. #define get_bits14(result) get_bitsX(14, 18, result)
  134. #define get_bits15(result) get_bitsX(15, 17, result)
  135. #define get_bits16(result) get_bitsX(16, 16, result)
  136. #define get_bits17(result) get_bitsX(17, 15, result)
  137. #define get_bits18(result) get_bitsX(18, 14, result)
  138. #define get_bits19(result) get_bitsX(19, 13, result)
  139. #define get_bits20(result) get_bitsX(20, 12, result)
  140. #define get_bits21(result) get_bitsX(21, 11, result)
  141. #define get_bits22(result) get_bitsX(22, 10, result)
  142. #define get_bits23(result) get_bitsX(23,  9, result)
  143. #define get_bits24(result) get_bitsX(24,  8, result)
  144. #define get_bits25(result) get_bitsX(25,  7, result)
  145. #define get_bits26(result) get_bitsX(26,  6, result)
  146. #define get_bits27(result) get_bitsX(27,  5, result)
  147. #define get_bits28(result) get_bitsX(28,  4, result)
  148. #define get_bits29(result) get_bitsX(29,  3, result)
  149. #define get_bits30(result) get_bitsX(30,  2, result)
  150. #define get_bits31(result) get_bitsX(31,  1, result)
  151. #define get_bits32(result) get_bitsX(32,  0, result)
  152.  
  153. #define get_bitsn(num, result) get_bitsX((num),(32-(num)),result)
  154.  
  155. #define show_bitsX(num, thresh, result)                                    \
  156. {                                                                          \
  157.   int OFFnum = (bitOffset - thresh);                                       \
  158.                                                                            \
  159.   /* Check for underflow. */                                               \
  160.   if (bufLength < 2) {                                                     \
  161.     correct_underflow();                                                   \
  162.   }                                                                        \
  163.                                                                            \
  164.   if (OFFnum <= 0) {                                                       \
  165.     *(result) = ((curBits & bitMask[bitOffset]) >> (-OFFnum));             \
  166.   } else {                                                                 \
  167.     *(result) = (((curBits & bitMask[bitOffset]) << OFFnum) |              \
  168.              ((*(bitBuffer+1) & (nBitMask[OFFnum])) >> (32-OFFnum)));      \
  169.   }                                                                        \
  170. }
  171.  
  172. #define show_bits1(result)  show_bitsX(1,  31, result)
  173. #define show_bits2(result)  show_bitsX(2,  30, result)
  174. #define show_bits3(result)  show_bitsX(3,  29, result)
  175. #define show_bits4(result)  show_bitsX(4,  28, result)
  176. #define show_bits5(result)  show_bitsX(5,  27, result)
  177. #define show_bits6(result)  show_bitsX(6,  26, result)
  178. #define show_bits7(result)  show_bitsX(7,  25, result)
  179. #define show_bits8(result)  show_bitsX(8,  24, result)
  180. #define show_bits9(result)  show_bitsX(9,  23, result)
  181. #define show_bits10(result) show_bitsX(10, 22, result)
  182. #define show_bits11(result) show_bitsX(11, 21, result)
  183. #define show_bits12(result) show_bitsX(12, 20, result)
  184. #define show_bits13(result) show_bitsX(13, 19, result)
  185. #define show_bits14(result) show_bitsX(14, 18, result)
  186. #define show_bits15(result) show_bitsX(15, 17, result)
  187. #define show_bits16(result) show_bitsX(16, 16, result)
  188. #define show_bits17(result) show_bitsX(17, 15, result)
  189. #define show_bits18(result) show_bitsX(18, 14, result)
  190. #define show_bits19(result) show_bitsX(19, 13, result)
  191. #define show_bits20(result) show_bitsX(20, 12, result)
  192. #define show_bits21(result) show_bitsX(21, 11, result)
  193. #define show_bits22(result) show_bitsX(22, 10, result)
  194. #define show_bits23(result) show_bitsX(23,  9, result)
  195. #define show_bits24(result) show_bitsX(24,  8, result)
  196. #define show_bits25(result) show_bitsX(25,  7, result)
  197. #define show_bits26(result) show_bitsX(26,  6, result)
  198. #define show_bits27(result) show_bitsX(27,  5, result)
  199. #define show_bits28(result) show_bitsX(28,  4, result)
  200. #define show_bits29(result) show_bitsX(29,  3, result)
  201. #define show_bits30(result) show_bitsX(30,  2, result)
  202. #define show_bits31(result) show_bitsX(31,  1, result)
  203. #define show_bits32(result) show_bitsX(32,  0, result)
  204.  
  205. #define show_bitsn(num,result) show_bitsX((num),(32-(num)),result)
  206.  
  207. #define flush_bits(num)                                               \
  208. {                                                                     \
  209.   if (BitStream == NULL) {                                            \
  210.     longjmp(env,ERR_NO_BIT_STREAM);                                   \
  211.   }                                                                   \
  212.                                                                       \
  213.   if (bufLength < 2) {                                                \
  214.     correct_underflow();                                              \
  215.   }                                                                   \
  216.                                                                       \
  217.   UPDATE_COUNT(num);                                                  \
  218.                                                                       \
  219.   bitOffset += num;                                                   \
  220.                                                                       \
  221.   if (bitOffset > 31) {                                               \
  222.     bitBuffer++;                                                      \
  223.     curBits = *bitBuffer;                                             \
  224.     bufLength--;                                                      \
  225.     bitOffset -= 32;                                                  \
  226.   }                                                                   \
  227. }
  228.  
  229.